<?php
class Template{
	private $file;
	private $contents;
	private $outputs;
	private $lang;
	
	function __construct($f){
		$this->file = file_get_contents($f) or ex_throw(new Exception("Template::__construct($f): Fájl nem található vagy üres"));
	}
	function setOutputs($o){
		$this->outputs=$o;
	}
	private function get_output($key){
		if(!isset($this->outputs[$key])){
			return "[".$key."]";
		}
		return $this->outputs[$key];
	}
	function setStrings($f){
		$this->lang = new ConfigManager($f);
	}
	
	function getContent($c){ // visszaadja egy content tartalmát; hiba esetén false-t.
		$contentpos = strpos($this->file, '<content name="'.$c); // a content tag kezdete
		if($contentpos===false){return false;} //nincs ilyen content
		
		$startpos = strpos($this->file, '>', $contentpos)+1; // ahhol ténylegesen kezdődik a content tartalama
		
		$endpos;
		$searchstart = $startpos;
		
		$sum = 1; // ennyi zázó kell még
		while($sum!=0){
			
			$endpos = strpos($this->file, '</content>', $searchstart+1)-1; // a cntnt látszólagos vége
			
			/*echo "\n\nwhile:\nstart, end:\n";
			var_dump($searchstart);
			var_dump($endpos);*/
			
			$num = substr_count($this->file, '<content', $searchstart, ($endpos-$searchstart)); //van a vége előtt $num darab content nyitó tag
			
			$sum += $num-1; //Találtunk 1 db zárót, de num nyitót előtte. Tehát num-1 záró kell még pluszba
			$searchstart = $endpos+1; // az előző végétől keresünk tovább a következő körben
			
			
			//echo "\nnum:".$num."\nsum:\n".$sum;
			
		}
		return substr($this->file, $startpos, $endpos-$startpos+1);
		
	}
	function setContent($c, $values){ //$c - név; $values - a következő elem értékei
		$this->contents[$c][]=$values;
		
		//contents[contentnév][sorszám][kulcs]
	}
	
	
	
	private function prepareContent($cname){ //$cname = a content neve
		$startpos = strpos($this->file, '<content name="'.$cname);
		$contnameend = strpos($this->file, '"', $startpos+15);
	
		if(is_null($this->contents[$cname])){
			return '';
		}
		
		$contendpos = strpos($this->file, '</content>', $contnameend); //a </content> elem végének pozíciója
		$text = $this->getContent($cname);
		$s;
		
		foreach($this->contents[$cname] as $v){ // egy adott content érték tömbjei; $v - az aktuális "értéktömb"
			
			$current = $text;
			//insider content kezelése
			while(strpos($current, '<content')){ //amíg van beágyazott content //content start a külső vége előtt
				$insidertagstart = strpos($this->file, '<content', $contnameend); // a névhez még 15-öt hozzá kell adni
				$insidernameend = strpos($this->file, '"', $insidertagstart+15);
				$insidername = substr($this->file, $insidertagstart+15, (($insidernameend-1)-($insidertagstart+15)+1));
				if(isset($v[$insidername])){
					$this->contents[$insidername] = $v[$insidername]; // berakjuk a fő tömbbe az aktuális outer tömb altömbjét
					$insidervalue = '<content name="'.$insidername.'">'.$this->getContent($insidername).'</content>';
					$current = str_replace($insidervalue, $this->prepareContent($insidername), $current);
				}
			}
			$s .= preg_replace('/\[([a-zA-Z0-9_]*)\]/e', '$v[\'$1\']', $current);
		}
		
		return $s;
	}
	
	private function docontent($conttagstart){ // befordít egy contentet a kezdő pos. alapján
		
		$contnameend = strpos($this->file, '"', $conttagstart+15); // az első cntnt nevének a vége;    a név utolsó karakteréhez 1-et ki kell vonni

		$contname = substr($this->file, ($conttagstart+15), (($contnameend-1)-($conttagstart+15)+1));
		$contvalue = '<content name="'.$contname.'">'.$this->getContent($contname).'</content>';
		$this->file = str_replace($contvalue, $this->prepareContent($contname), $this->file);
	}
	
	function flush(){
		echo $this->str_flush();
	}
	function str_flush(){
		if(!isset($this->outputs)){
			throw new Exception("Template::str_flush() hiányoznak a szükséges tartalmak!");
		}
		
		
		// content
		$i=0;
		while(strpos($this->file, '<content')!==false){ // amég vannak content-blokkok
			$start = strpos($this->file, '<content name="'); // a cntnt tag eleje;   a névhez még 15-öt kell hozzáadni
			$this->docontent($start);
		}
		
		
		// output
		$this->file=preg_replace('/\[([a-zA-Z0-9_]*)\]/e', '$this->get_output("$1")', $this->file);
		
		// strings
		$this->file=preg_replace('/\{([a-zA-Z0-9_]*)\}/e', '$this->lang->get("$1")', $this->file);
		
		
		return $this->file;
		
	}
}
?>
